package com.mzx.javase.集合;

import javax.lang.model.element.VariableElement;
import java.util.*;

/**
 * 类描述：TreeSet集合的使用
 *
 * 总结：在使用treemap和treeset时，需要传入自定义比较器；
 * 自定义比较器有两种实现方式：
 *  1、TreeSet所存放的类继承Comparable接口(泛型是存储类型)，重写其中的compareTo方法
 *  2、在调用TreeSet或TreeMap构造方法时，传入一个自定义比较器，使用匿名内部类，实例化comparator接口(泛型传入存储类型)，重写其中的compare方法
 *
 * @ClassName TreeSetTest01
 * @Description TODO
 * @Author 69417
 * @Date 2022/7/12 21:45
 * @Version 1.0
 */
public class TreeSetTest01 {
    /*
     * TreeSet 底层采用自平衡二叉树，将粗放囊的元素按照大小自动排序
     *
     *
     *
     *
     **/
    public static void main(String[] args) {
        Set<String> treeSet = new TreeSet<>();
        treeSet.add("banana");
        treeSet.add("abandon");
        treeSet.add("city");
        treeSet.add("apple");
        System.out.println("treeSet排序后的集合：" + treeSet);

        TreeSet<Animal> animals = new TreeSet<>();
        animals.add(new Animal(25, "wugui"));
        animals.add(new Animal(18, "bird"));
        animals.add(new Animal(15, "cat"));

        System.out.println("treeSet集合中的动物类：" + animals);
        /**
         * @description: 优先按照年龄升序排序；若年龄相同，则按照姓名升序排序；传入自定义的比较器Comparator
         * @author: 马子鑫
         * @date: 2022/7/13 10:37
         * @param: args
         **/
        Set<Animal> animals1 = new TreeSet<Animal>(new Comparator<Animal>() {
            @Override
            public int compare(Animal o1, Animal o2) {
                if (o1.getAge() == o2.getAge()) {
                    return o1.getName().compareTo(o2.getName());
                }
                return o1.getAge() - o2.getAge();
            }
        });
        animals1.add(new Animal(18, "bird"));
        animals1.add(new Animal(15, "cat"));
        animals1.add(new Animal(16, "tortoise"));
        animals1.add(new Animal(16, "bird"));
        Iterator<Animal> animalIterator = animals1.iterator();
        System.out.println("------------------------------");
        while (animalIterator.hasNext()) {
            System.out.println(animalIterator.next());
        }

    }
}
class Animal implements Comparable<Animal>{
    private int age;
    private String name;

    public Animal() {
    }

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Animal o) {
        return this.age - ((Animal)o).age;
    }
}

